package model;

import org.jblas.DoubleMatrix;

import util.RandomMatrix;

/**
 * Linear layer of the network.
 * 
 * 线性神经网络层。
 * 
 * @author Tianyu Xu
 * 
 */
public class LinearLayer {
	/**
	 * 网络输出大小
	 */
	private int outputSize = 0;
	/**
	 * 网络输入大小
	 */
	private int inputSize = 0;
	/**
	 * 网络权重矩阵
	 */
	private DoubleMatrix W = null;
	/**
	 * 网络 bias 向量
	 */
	private DoubleMatrix bias = null;

	/**
	 * 构造一个线性变换网络层
	 * 
	 * @param layerOutputSize
	 *            网络输出大小
	 * @param layerInputSize
	 *            网络输入大小
	 */
	public LinearLayer(int layerOutputSize, int layerInputSize) {
		outputSize = layerOutputSize;
		inputSize = layerInputSize;

		// initialize the weight matrix W and the bias vector
		// 初始化权重矩阵W和偏置向量bias
		W = RandomMatrix.rand(outputSize, inputSize);
		bias = RandomMatrix.rand(outputSize);
	}

	/**
	 * 根据权重矩阵和 bias 向量进行线性变换
	 * 
	 * @param inputVector
	 *            传入线性网络层的输入
	 * @return 线性网络层的输出
	 */
	public DoubleMatrix performLinearTrans(DoubleMatrix inputVector) {
		DoubleMatrix output = W.mmul(inputVector);
		output.addColumnVector(bias);
		return output;
	}

	/**
	 * 获得权重矩阵对象
	 * 
	 * @return 对权重矩阵对象
	 */
	public DoubleMatrix getW() {
		return W;
	}

	/**
	 * 获得 bias 向量对象
	 * 
	 * @return bias 向量对象
	 */
	public DoubleMatrix getBias() {
		return bias;
	}
}